// /public/hash.js

// 导入脚本 加载 JS 脚本。
self.importScripts('./spark-md5.min.js')

/**
 * 目的是将一个大文件分割成多个小块，分别计算每个小块的MD5值，
 * 然后将这些小块的MD5值合并起来，最终得到整个文件的MD5哈希值。
 * 这种方法可以在处理大文件时减少内存的使用，
 * 并且可以在文件上传过程中就开始计算哈希值，提高效率。
 * @param {*} e
 */
// 指定message事件的监听函数。 生成文件 hash
self.onmessage = (e) => {
  const { fileChunkList } = e.data
  const spark = new self.SparkMD5.ArrayBuffer()
  let percentage = 0
  let count = 0
  //用于读取文件块。它接受一个参数 index，表示要读取的文件块在 fileChunkList 中的索引。
  const loadNext = (index) => {
    const reader = new FileReader()
    reader.readAsArrayBuffer(fileChunkList[index].file)
    //当文件块读取完成时，onload 事件会被触发。
    reader.onload = (e) => {
      // 累加器 不能依赖index
      count++
      // 增量计算md5
      // 使用 spark.append 方法将读取到的文件块数据（e.target.result）追加到 SparkMD5 实例中，用于计算哈希值。
      spark.append(e.target.result)
      // 检查是否所有文件块都已处理
      if (count === fileChunkList.length) {
        // 通知主线程，计算结束
        self.postMessage({
          percentage: 100,
          //如果所有文件块都已处理，使用 spark.end() 方法计算最终的MD5哈希值。
          hash: spark.end(),
        })
        self.close()
      } else {
        // 每个区块计算结束，通知进度即可
        percentage += 100 / fileChunkList.length
        self.postMessage({
          percentage,
        })
        // 计算下一个
        loadNext(count)
      }
    }
  }
  loadNext(0)
}
